<?php
// 提醒函数
if (!function_exists('notice')) {
  /**
   * 提示信息函数
   * @param string $msg 提示信息
   * @param string $url 指定跳转地址(可填)
   */
  function notice(string $msg, string $url = null)
  {
    if ($url) {
      echo "
                <script>
                    alert('$msg');
                    location.href = '$url';
                </script>
            ";
      exit;
    } else { //试用模版字符
      echo <<<nocitce
                <script>
                    alert('$msg');
                    history.go(-1);
                </script>
            nocitce;
      exit;
    }
  }
}

// 保存图片
if (!function_exists(("build_upload"))) {
  /**
   * 单图上传
   * @param string $name 文件名
   * @param string $path 指定保存路径
   * @param array $type 允许上传的图片类型
   * @param int $size 指定上传图片大小
   * @return array 返回结果数组
   */

  function build_upload($name, $path = "uploads", $type = ['jpg', 'jpeg', 'png', 'gif'], $size = 1048576)
  {
    //返回结果
    $result = [
      "code" => 0, //状态码 0=>失败 1=>成功
      "msg" => "返回信息", //返回信息
      "data" => null, //返回数据
    ];

    // 接收图片信息
    $file = $_FILES[$name] ?? "";
    $errCode = $_FILES[$name]["error"] ?? 4;
    $DateDir = date("Ymd", time());
    $path = ASSETS_PATH . $path . '/' . $DateDir . '/';
    $ext = pathinfo($file["name"], PATHINFO_EXTENSION);
    // 重新命名，防止不同双方同时同名的上传文件
    $fileName = date("YmdHis", time()) . mt_rand(1000, 9999) . mt_rand(1000, 9999) . "." . $ext;
    $savePath = "/assets/" . "uploads/" . $DateDir . "/";


    // 验证图片是否存在
    if (empty($file)) {
      $result['msg'] = "图片不存在";
      return $result;
    };

    // 错误码检验
    switch ($errCode) {
      case 1: {
          $result['msg'] = "上传大小不能超过upload_max_filesize设置的值";
          return $result;
        }
      case 2: {
          $result['msg'] = "上传大小不能超过MAX_FILE_SIZE设置的值";
          return $result;
        }
      case 3: {
          $result['msg'] = "图片上传不完整";
          return $result;
        }
      case 4: {
          $result['msg'] = "没有选择图片";
          return $result;
        }
      default:
    }

    // 验证目录存在,不存在则创建目录
    if (!is_dir($path)) {
      // 创建目录
      mkdir($path, 0755, true);
    }

    // 检查图片类型
    if (!in_array($ext, $type)) {
      $result['msg'] = "图片类型错误";
      return $result;
    }

    // 检查图片大小
    if ($file["size"] > $size) {
      $result['msg'] = "图片过大，请先压缩再上传";
      return $result;
    }

    // 验证文件是否通过http post上传
    if (!is_uploaded_file($file["tmp_name"])) {
      $result['msg'] = "上传图片错误";
      return $result;
    }

    // 保存图片
    // 验证是否保存文件，用保存操作的结果来做条件进行判断
    if (move_uploaded_file($file["tmp_name"], $path . $fileName)) {
      $result = [
        "code" => 1, //状态码 0=>失败 1=>成功
        "msg" => "数据上传成功", //返回信息
        "data" => $savePath . $fileName, //返回数据
      ];
      return $result;
    } else {
      $result['msg'] = "图片上传失败";
      return $result;
    }
  };
};

//密码盐
if (!function_exists('build_randstr')) {
  /**
   * 获得随机字符串
   * @param $len             需要的长度
   * @param $special        是否需要特殊符号
   * @return string       返回随机字符串
   */
  function build_randstr($len = 8, $special = false)
  {

    $chars = array(
      "a",
      "b",
      "c",
      "d",
      "e",
      "f",
      "g",
      "h",
      "i",
      "j",
      "k",
      "l",
      "m",
      "n",
      "o",
      "p",
      "q",
      "r",
      "s",
      "t",
      "u",
      "v",
      "w",
      "x",
      "y",
      "z",
      "A",
      "B",
      "C",
      "D",
      "E",
      "F",
      "G",
      "H",
      "I",
      "J",
      "K",
      "L",
      "M",
      "N",
      "O",
      "P",
      "Q",
      "R",
      "S",
      "T",
      "U",
      "V",
      "W",
      "X",
      "Y",
      "Z",
      "0",
      "1",
      "2",
      "3",
      "4",
      "5",
      "6",
      "7",
      "8",
      "9"
    );

    if ($special) {
      // array_merge — 合并一个或多个数组
      $chars = array_merge($chars, array(
        "!",
        "@",
        "#",
        "$",
        "?",
        "|",
        "{",
        "/",
        ":",
        ";",
        "%",
        "^",
        "&",
        "*",
        "(",
        ")",
        "-",
        "_",
        "[",
        "]",
        "}",
        "<",
        ">",
        "~",
        "+",
        "=",
        ",",
        "."
      ));
    }

    // count: 数组中的长度
    $charsLen = count($chars) - 1;

    // shuffle => 打乱数组
    shuffle($chars);

    $str = null;

    for ($i = 0; $i < $len; $i++) {
      // 随机取出一位  mt_rand:返回随机整数
      $str .= $chars[mt_rand(0, $charsLen)];
    }

    return $str;
  }
}

//查询
if (!function_exists('find')) {
  /**
   * 添加数据
   * @param string $sql sql查询语句
   * @return array 返回结果集$result[]
   */
  function find($sql)
  {
    global $conn;
    $data = [];
    // 执行sql
    $result = mysqli_query($conn, $sql);

    if ($result && mysqli_num_rows($result) > 0) {
      $data = mysqli_fetch_assoc($result);
    }
    return $data;
  }
}

//插入
if (!function_exists('add')) {
  /**
   * 添加数据
   * @param string $table 表名
   * @param array  $data  插入的数据
   * @return array 返回结果集
   */
  function add($table, $data)
  {
    global $conn, $prefix;

    // 拼接表名
    $table = $prefix . $table;

    // 获取数组的字段名
    $fieldArr = array_keys($data);

    // 字段名数组转成字符串
    $fields = '`' . implode('`,`', $fieldArr) . '`';

    // 获取数组的值
    $values = "'" . implode("','", $data) . "'";

    // INSERT INTO `table`(`field`)VALUES('value');
    $sql = "INSERT INTO `$table`($fields)VALUES($values)";

    // 执行sql
    $result = mysqli_query($conn, $sql);

    if ($result) {
      return [
        'code' => 1,
        'msg' => '添加数据',
        'data' => [
          // 返回当前数据表最后一次自增id
          'insert_id' => mysqli_insert_id($conn)
        ]
      ];
    } else {
      return [
        'code' => 0,
        'msg' => mysqli_error($conn),
        'data' => null
      ];
    }
  }
}

// 登录校验
if (!function_exists('LoginCheck')) {
  /**
   * 检测是否登录
   * @param bool $redirect 是否跳转
   * @return array 返回登录信息
   */
  function LoginCheck($redirect = true)
  {
    //  获取cookie中的admin
    $login = isset($_COOKIE['admin']) ? json_decode($_COOKIE['admin'], true) : [];


    if (!$login) {

      if ($redirect === true) {
        notice('请先登录', 'login.php');
      }

      return false;
    }

    // 接收cookie数据,验证cookie是否真实
    $id = $login['id'] ?? '';
    $username = $login['username'] ?? '';
    // 查询语句
    $sql = "SELECT `id`,`username`,`avatar` FROM `pre_admin` WHERE `id` = '$id' AND `username` = '$username'";
    // 查询结果
    $admin = find($sql);


    // 通过查询结果来验证是否免登录，在这里查询不是关键，关键是用返回的结果做验证
    if (!$admin) {
      // 清除cookie
      setcookie('admin', '', time() - 1);

      if ($redirect === true) {
        notice("非法登录", 'login.php');
      }

      return false;
    }

    return $admin;
  }
}

//多条查询
if (!function_exists('all')) {
  /**
   * 查询多条数据
   * @param string $sql 查询语句
   * @return array 返回查询数据
   */
  function all($sql)
  {
    global $conn;

    $data = [];

    $result = mysqli_query($conn, $sql);

    if ($result && mysqli_num_rows($result) > 0) {
      $data = mysqli_fetch_all($result, MYSQLI_ASSOC);
    }

    return $data;
  }
}

// 获取URL地址
if (!function_exists('getUrl')) {
  /**
   * 获取重组地址
   */
  function getUrl()
  {
    // 获取运行文件的路径
    $url = $_SERVER['PHP_SELF'] . '?';

    // $_GET是否有参数
    if ($_GET) {
      foreach ($_GET as $key => $val) {
        if ($key !== 'page') {
          $url .= $key . '=' . $val . '&';
        }
      }
    }

    return $url;
  }
}

//分页展示
if (!function_exists('ShowPage')) {
  /**
   * 分页
   * @param int|string $current 当前页
   * @param int $count 数据总数
   * @param int $limit 每页显示多少条数据
   * @param int $size 显示多少个页码
   * @param string $class 分页样式
   * @return string 返回html结构
   */
  function ShowPage($current, $count, $limit = 10, $size = 5, $class = 'digg')
  {
    $page = '';

    // 数据总数要大于每页显示的数据量才显示分页
    if ($count > $limit) {
      // 获取地址
      $url = getUrl();

      // 总分页数
      $PageCount = ceil($count / $limit);

      // 分页结构
      $page = '<div class="' . $class . '">';

      // 首页和上一页
      if ($current == 1) {
        $page .= '<span class="disabled">首&nbsp;页</span>';
        $page .= '<span class="disabled">上一页</span>';
      } else {
        $page .= '<a href="' . $url . 'page=1">首&nbsp;页</a>';
        $page .= '<a href="' . $url . 'page=' . ($current - 1) . '">上一页</a>';
      }

      /* 
                [1] 2 3 4 5
                1 [2] 3 4 5
                1 2 [3] 4 5
                // 1 2 3 [4] 5
                2 3 [4] 5 6
                2 3 4 [5] 6
            */

      // 中间页码显示
      if ($current <= floor($size / 2)) {
        // 当前页在中间位置靠左,floor()向下取整
        $start  =  1;

        // 如果总页数大于中间显示多少页,结束数字就是中间显示多少页的数字,否则结束数字就是总页数
        $end = $PageCount > $size ? $size : $PageCount;
      } elseif ($current >= $PageCount - floor($size / 2)) {
        // 当前页在中间位置靠右 避免页数出现0或者负数
        $start = $PageCount - $size + 1 <= 0 ? 1 : $PageCount - $size + 1;
        $end = $PageCount;
      } else {
        // 当前页刚好在中间位置
        $start = $current - floor($size / 2);
        $end = $current + floor($size / 2);
      }

      for ($i = $start; $i <= $end; $i++) {
        if ($i == $current) {
          $page .= '<span class="current">' . $i . '</span>';
        } else {
          $page .= '<a href="' . $url . 'page=' . $i . '">' . $i . '</a>';
        }
      }

      // 下一页和尾页
      if ($current == $PageCount) {
        $page .= '<span class="disabled">下一页</span>';
        $page .= '<span class="disabled">尾&nbsp;页</span>';
      } else {
        $page .= '<a href="' . $url . 'page=' . ($current + 1) . '">下一页</a>';
        $page .= '<a href="' . $url . 'page=' . $PageCount . '">尾&nbsp;页</a>';
      }

      $page .= '</div>';
    }

    return $page;
  }
}

if (!function_exists('del')) {
  /**
   * 删除数据
   * @param string $table 表名
   * @param string $DeleteWhere 删除条件
   * @return array
   */
  function del($table, $DeleteWhere)
  {
    global $conn, $prefix;

    $table = $prefix . $table;

    // 组装sql
    $sql = "DELETE FROM `$table` WHERE $DeleteWhere";

    $result = mysqli_query($conn, $sql);

    if ($result) {
      return [
        'code' => 1,
        'msg' => '删除成功',
        'data' => null
      ];
    } else {
      return [
        'code' => 0,
        'msg' => mysqli_error($conn),
        'data' => null
      ];
    }
  }
}

if (!function_exists('update')) {
  /**
   * 更新数据
   * @param string $table 表名
   * @param array $UpdateData 更新的数据
   * @param string $UpdateWhere 更新条件
   * @return array
   */
  function update($table, $UpdateData, $UpdateWhere)
  {
    global $conn, $prefix;

    $table = $prefix . $table;

    // UPDATE `table` SET `field` = 'value' WHERE $UpdateWhere

    $fields = '';

    foreach ($UpdateData as $field => $val) {
      $fields .= '`' . $field . "` = '" . $val . "',";
    }

    $fields = rtrim($fields, ',');

    $sql = "UPDATE `$table` SET $fields WHERE $UpdateWhere";

    $result = mysqli_query($conn, $sql);

    if ($result) {
      return [
        'code' => 1,
        'msg' => '更新成功',
        'data' => null
      ];
    } else {
      return [
        'code' => 0,
        'msg' => mysqli_error($conn),
        'data' => null
      ];
    }
  }
}
